/**
* 将ul结构转化为树形菜单函数
* 待解决问题：
* 1 动态异步加载
* 2 
* 3 
* 4 
*/
$.extend({
	ul2tree:function(opt,callback){
	// 默认参数
	this.defaults = {
		obj           :"",
		url           :"", // 数据地址
		data          :"",
		imageRoot     :"images/",  // 图片根路径
		img_width     :"18px", // 图片宽度
		line_height   :"18px", // 行高
		font_size     :"12px", // 字体大小
		clickFun      :false, // 文字点击函数，带一个参数，是<li />节点，
							  // 点击事件的目标节点是<li />下的<span />标签
		isLineImg     :true, // 是否使用线形图片
		isNodeImg     :true, // 节点图标
		forderOpen    :"folderOpen.gif", // 打开的文件夹图片
		forderClosed  :"folderClosed.gif", // 关闭的文件夹图片
		fileImg       :"leaf.gif", // 文件图片
		blankImg      :"blank.gif", // 空白占位图片
		lineImg1      :"line1.gif", // 竖线图片
		lineImg2      :"line2.gif", // └ 线图片
		lineImg3      :"line3.gif", // ├ 线图片
		lineImg4      :"line4.gif" // ┌ 线图片
	};
	
	//参数初始化
	opts = $.extend(this.defaults,opt);
	
	opts.forderOpen = opts.imageRoot + opts.forderOpen;
	opts.forderClosed = opts.imageRoot + opts.forderClosed;
	opts.fileImg = opts.imageRoot + opts.fileImg;
	opts.blankImg = opts.imageRoot + opts.blankImg;
	opts.lineImg1 = opts.imageRoot + opts.lineImg1;
	opts.lineImg2 = opts.imageRoot + opts.lineImg2;
	opts.lineImg3 = opts.imageRoot + opts.lineImg3;
	opts.lineImg4 = opts.imageRoot + opts.lineImg4;

	this.opt = opts ;

	
	/**
	* 读取数据
	*/
	if(opts.data != ""){
		$(opts.obj).html(json2ul(opts.data));
		addImg(opts.obj);
		addLine(opts.obj);
		addClick(opts.obj);
		formatStyle();
	}
	
	/**
	* 链接读取data
	*/
	if("" != opts.url){
		$.getJSON(opts.url, function(json){
			
			$(opts.obj).html(json2ul(json));
			
			addImg(opts.obj);
			addLine(opts.obj);
			addClick(opts.obj);
			formatStyle();
		});
	}else{
	}
	
	/**
	 * 矫正样式
	 */
	function formatStyle(){
		$(opts.obj).find("img").css({
			"display":"inline",
			"vertical-align":"bottom"
		});
		$(opts.obj).find("a").css({
			"line-height":"18px"
		});
	}
	
	/**
	* json 转化为 ul
	*/
	function json2ul(str){
		var data = string2Json(str);
		var ulstr = "";
		
		if(data.length > 0 ){
			ulstr += "<ul>"; 
			for( var i = 0; i < data.length; i++){
				//ulstr += "<li> <a href=\"#\">";
				if(opts.clickFun)
					// 如果有点击函数，将json对象转化成字符串作为a标签的data属性
					ulstr += "<li> <a href=\"#\" data='" + JSON.stringify(data[i]) + "'>";
				else
					ulstr += "<li> <a href=\"#\">";
				ulstr += (data[i].name + "</a>");
				if(data[i].children){
					ulstr += json2ul(data[i].children);
				}
				ulstr += "</li>";
			}
			ulstr +="</ul>";
		}
		
		return ulstr;
	}
	
	/**
	* 将字符串转换为JSON对象
	* @param str 字符串对象，如果str已经是JSON对象，则直接返回
	*/
	function string2Json(str){
		var obj;

		// 判断传入值是否为string 对象
		if(typeof str == "string")
			obj = eval('(' + str + ')');
		else 
			obj = str;
		return obj;
	}
	
	/**
	* 增加文字点击函数
	*/
	function addClick(objs){
		if(opts.clickFun){
			$(objs).find("a").each(function(){
				$(this).click(function(){
					// 读取a标签中data属性并转化为json对象
					opts.clickFun(string2Json($(this).attr("data")), $(this).parent());
					$(this).attr("data");
				});
			});
		}	
	}
	
	/**
	* 添加文件夹及文件图片
	*/
	function addImg(objs){
		// ul样式初始化
		
		$(objs).find("ul").css({
			"list-style-type":"none",
			"padding-left":"0px",
			"margin":"0px"
		});
		
		$(objs).find("li").each(function(){
		
			$(this).css({
				//"height":opts.line_height,
				"line-height":opts.line_height,
				"font-size":opts.font_size
			});
			// 增加节点图片
			if(opts.isNodeImg){
				if($(this).find("ul").size() > 0){
					$(this).prepend("<img src=\"" + opts.forderOpen + "\" />");
					
					// 节点图片动作展开关闭
					$(this).find("img:last")
							.click(function(){
							
						if($(this).attr("src").indexOf(opts.forderClosed) != -1){
							$(this).attr("src",opts.forderOpen);
							$(this).parent().find("ul:first").css({
								"display":"block",
								"visibility":"visible"
							});
						}else if($(this).attr("src").indexOf(opts.forderOpen) != -1){
							$(this).parent().find("ul:first").css({
								"display":"none",
								"visibility":"hidden"
							});
							$(this).attr("src",opts.forderClosed);
						}
					});
				}else{
					$(this).prepend("<img src=\"" + opts.fileImg + "\" />");
				}
			}
		});
	}
	
	/**
	* 增加线条
	*/ 
	function addLine(objs){
		// 判断是否使用线条图片
		if(opts.isLineImg){
			// 增加竖线线条
			$(objs).parent().find("ul").each(function(){
				$(this).find("li").each(function(){
					$(this).prepend("<img src=\"" + opts.lineImg1 + "\" />");
				});
			});
			// 增加三通节点线条
			$(objs).find("a").each(function(){
				if($(this).prev().size() > 0 ){
					if($(this).prev().prev().size() > 0 && 
						$(this).prev().prev().attr("src").indexOf(opts.lineImg1) != -1){
						
						$(this).prev().prev().attr("src", opts.lineImg3);
					}else if($(this).prev().attr("src").indexOf(opts.lineImg1) != -1){
						$(this).prev().attr("src", opts.lineImg3);
					}
				}
			});
			
			//修改根节点线条
			$(objs).find("img").first().attr("src", opts.lineImg4);
			
			//修改没有后续节点的节点线条
			$(objs).find("li").each(function(){
				if($(this).next().size() == 0){
					$(this).find("a").first().prev().prev().attr("src", opts.lineImg2);
					var size = $(this).find("a").first().prevUntil().size() - 2;
					//处理空白线条
					$(this).find("li").each(function(){
						$(this).find("img:eq(" + size + ")").attr("src", opts.blankImg);
					});
				}
			});
		}else{
			// 不适用线条图片时，使用空白分出级别
			$(objs).find("ul").each(function(){
				$(this).css({
					"padding-left":opts.img_width
				});
			});
		}
	}
	
	return this;
}});